package utils

import (
	"fmt"
	"reflect"
)

func HasFeild(p interface{}) {
	// 通过反射获取结构体类型信息
	t := reflect.TypeOf(p)

	// 遍历所有字段
	for i := 0; i < t.NumField(); i++ {
		field := t.Field(i) // 获取当前字段的信息
		fmt.Println(field)
	}
}

// 判断结构体方法是否存在
func MethodExists(in any, method string) bool {
	if method == "" {
		return false
	}
	p := reflect.TypeOf(in)
	if p.Kind() == reflect.Pointer {
		p = p.Elem()
	}
	// 不是结构体时
	if p.Kind() != reflect.Struct {
		return false
	}
	object := reflect.ValueOf(in)
	// 获取到方法
	newMethod := object.MethodByName(method)
	if !newMethod.IsValid() {
		return false
	}
	return true
}

func GetSlice(s interface{}) []interface{} {
	v := reflect.ValueOf(s)
	var list []interface{}
	if v.Kind() == reflect.Slice {
		// 遍历切片元素并打印
		for i := 0; i < v.Len(); i++ {
			elem := v.Index(i).Interface().(interface{}) // 通过索引访问切片元素，并进行类型断言
			list = append(list, elem)
		}
	}
	return list
}

func typeOfStruct(obj interface{}) reflect.Type {
	t := reflect.TypeOf(obj)
	for t.Kind() == reflect.Ptr {
		t = t.Elem()
	}
	return t
}

func hasField(obj interface{}, field string) bool {
	t := typeOfStruct(obj)
	_, ok := t.FieldByName(field)
	return ok
}
